home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 22
/
Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso
/
Aminet
/
util
/
blank
/
BeyondTheDark.lha
/
BeyondTheDark
/
Developer
/
Source
/
Darkness
/
Darkness.c
next >
Wrap
C/C++ Source or Header
|
1995-02-12
|
5KB
|
222 lines
/* Darkness Library */
#include <exec/memory.h>
#include <exec/execbase.h>
#include <graphics/gfxbase.h>
#include <intuition/intuitionbase.h>
#include <libraries/iffparse.h>
#include <utility/tagitem.h>
#include <clib/macros.h>
#define __USE_SYSBASE 42
#include <proto/exec.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/utility.h>
#include <BTD.h>
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct Library *UtilityBase;
/* #define DEBUG YES */
#ifdef DEBUG
void KPrintF(char *,...);
#define DEBUG_PRINTF(a,b) KPrintF(a,b);
#define DEBUG_PRINT(a) KPrintF(a)
#else
#define DEBUG_PRINTF(a,b)
#define DEBUG_PRINT(a)
#endif
#define DTAG(o) (BTD_Client+(o))
#define DP_Mode DTAG(0)
#define DP_Seconds DTAG(1)
#define DEF_SECONDS 60L
#define MAX_SECONDS 3600L
#define DEF_MODES 0L
#define MAX_MODES 1L
char *Modes[] = {"Stay Dark","Cycle once in a while",NULL};
struct BTDCycle DarkCycleParams[] =
{
DP_Mode,"Mode",BTDPT_CYCLE,DEF_MODES,Modes
};
struct BTDInteger DarkIntParams[] =
{
DP_Seconds,"Seconds",BTDPT_INTEGER,DEF_SECONDS,1L,MAX_SECONDS,TRUE,
};
struct BTDNode *DarkParams[] =
{
&DarkCycleParams[0].BC_Node,
&DarkIntParams[0].BI_Node,
NULL
};
struct BTDInfo DarknessInfo =
{
BTDI_Revision,MAKE_ID('D','A','R','K'),
"Darkness Blanker","Total Darkness","Markus Illenseer 1994",
DarkParams
};
struct DarkStruct
{
struct BTDDrawInfo *BTDDrawInfo;
LONG Seconds;
LONG Mode;
LONG Time;
LONG RandN,RandF,RandI;
};
/* library stuff */
char MyBlankerName[] = "darkness.btd";
char MyBlankerID[] = "Darkness Blanker V" VERSION "." REVISION " for BTD";
LONG MyBlankerLibInit(void)
{
if (GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",37L))
{
if (IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",37L))
{
if (UtilityBase=OpenLibrary("utility.library",37L)) return TRUE;
CloseLibrary (&IntuitionBase->LibNode);
}
CloseLibrary (&GfxBase->LibNode);
}
return FALSE;
}
void MyBlankerLibFree(void)
{
CloseLibrary (UtilityBase);
CloseLibrary (&IntuitionBase->LibNode);
CloseLibrary (&GfxBase->LibNode);
}
struct BTDInfo *QueryMyBlanker(void)
{
return &DarknessInfo;
}
void __regargs InitRandom(struct DarkStruct *DP,ULONG Instance)
{
ULONG Time[2];
CurrentTime (&Time[0],&Time[1]);
DP->RandN=(LONG)Time[0];
if (Time[1]<1024L) Time[1]|=1;
else Time[1]>>=10;
Time[1]^=Instance;
DP->RandF=4*Time[1]+1;
DP->RandI=2*Time[1]+1;
}
WORD __regargs Random(struct DarkStruct *DP,WORD Max)
{
DP->RandN=DP->RandF*DP->RandN+DP->RandI;
if (DP->RandN<0L) DP->RandN=-DP->RandN;
return (WORD)(DP->RandN%Max);
}
#define FindTagData(l,t,d) GetTagData((t),(d),(l))
struct DarkStruct *InitMyBlanker(struct TagItem *TagList)
{
struct DarkStruct *DP;
struct BTDDrawInfo *BTDDrawInfo;
ULONG *Error,Dummy,Instance;
if ((BTDDrawInfo=(struct BTDDrawInfo *)
FindTagData(TagList,BTD_DrawInfo,NULL))==NULL) return NULL;
Error=(LONG *)FindTagData(TagList,BTD_Error,(ULONG)&Dummy);
if ((DP=AllocVec(sizeof(struct DarkStruct),MEMF_PUBLIC|MEMF_CLEAR))==NULL)
{
*Error=BTDERR_Memory;
return NULL;
}
DP->BTDDrawInfo=BTDDrawInfo;
Instance=FindTagData(TagList,BTD_Instance,0L);
InitRandom(DP,Instance);
DP->Seconds=FindTagData(TagList,DP_Seconds,DEF_SECONDS);
DP->Mode=FindTagData(TagList,DP_Mode,DEF_MODES);
if(DP->Mode==1L)
{
BTDDrawInfo->BDI_Red[BTDDrawInfo->BDI_Pens[0]]=0;
BTDDrawInfo->BDI_Green[BTDDrawInfo->BDI_Pens[0]]=0;
BTDDrawInfo->BDI_Blue[BTDDrawInfo->BDI_Pens[0]]=0;
BTDDrawInfo->BDI_Changed[BTDDrawInfo->BDI_Pens[0]]=TRUE;
SetAPen (BTDDrawInfo->BDI_RPort,BTDDrawInfo->BDI_Pens[0]);
RectFill(BTDDrawInfo->BDI_RPort,BTDDrawInfo->BDI_Left,
BTDDrawInfo->BDI_Top,
BTDDrawInfo->BDI_Left+BTDDrawInfo->BDI_Width-1,
BTDDrawInfo->BDI_Top+BTDDrawInfo->BDI_Height-1);
}
DP->Time=Random(DP,60);
return DP;
}
void EndMyBlanker(struct DarkStruct *DP)
{
DEBUG_PRINT("Dark: FreeMem\n");
FreeVec (DP);
}
void AnimMyBlanker(struct DarkStruct *DP)
{
ULONG Seconds,Micros;
CurrentTime (&Seconds,&Micros);
if(DP->Mode==0L) WaitTOF();
else
if (Seconds>=DP->Time)
{
WaitTOF();
DP->Time=Seconds+DP->Seconds;
DP->BTDDrawInfo->BDI_Red[DP->BTDDrawInfo->BDI_Pens[0]]=Random(DP,255);
DP->BTDDrawInfo->BDI_Green[DP->BTDDrawInfo->BDI_Pens[0]]=Random(DP,255);
DP->BTDDrawInfo->BDI_Blue[DP->BTDDrawInfo->BDI_Pens[0]]=Random(DP,255);
DP->BTDDrawInfo->BDI_Changed[DP->BTDDrawInfo->BDI_Pens[0]]=TRUE;
}
}
ULONG PenCountMyBlanker(struct TagItem *TagList)
{
return ((FindTagData(TagList,DP_Mode,DEF_MODES)==1)?(ULONG)1:(ULONG)0L);
}